package com.lmf.juc.sync.case2;

/**
 * 创建资源类，利用synchronized同步锁实现
 */
public class Share {
    private int number = 0;

    //创建+1方法
    public synchronized void incr() throws InterruptedException {
        //判断是否等于0
        while (number != 0) {
            //若不为0，则线程等待，让其他线程先执行
            /**
             * wait():这个方法有个特点，就是在哪里睡，被唤醒时，就会接着往下执行，而不会重新判断再执行。
             *    解决这个弊端方法：
             *      1.放在while()循环方法中，这样醒来也会判断条件
             *      2.放在方法体最后，没有其他代码可以被执行。
             */
            this.wait();
        }
        //若等于0，再加一
        number++;
        System.out.println(Thread.currentThread().getName() + "::更改number = " + number);
        //且通知其他线程,开始执行
        this.notifyAll();

    }

    //创建-1方法
    public synchronized void decr() throws InterruptedException {
        //判断是否等于0
        while (number == 0) {
            //若为0，则线程等待，让其他线程先执行
            this.wait();
        }
        //若不等于0，减一
        number--;
        System.out.println(Thread.currentThread().getName() + "::更改number = " + number);
        //且通知其他线程,开始执行
        this.notifyAll();
    }
}
